{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "__Author:__ Bram Van de Sande\n",
    "\n",
    "__Date:__ 20 APR 2018\n",
    "\n",
    "__Outline:__ To make the pySCENIC code more robust to the selection of the network inference method in the first step of\n",
    "the pipeline, the default values for weight thresholds should not be absolute (i.e. 0.001 or 0.005) but percentile based.\n",
    "\n",
    "As example we're using the example run used in the tutorial of the R version of SCENIC."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "DATA_FOLDER='/Users/bramvandesande/Projects/lcb/resources'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.1_exprMatrix_filtered.RData     grnboost2_adjacencies.tsv\n",
      "1.1_exprMatrix_filtered.csv       hs_tfs.txt\n",
      "1.2_inputTFs.RData                input_tfs.txt\n",
      "1.2_inputTFs.csv                  mm_tfs.txt\n",
      "1.5_GENIE3_linkList.RData         motifs-v9-nr.hgnc-m0.001-o0.0.tbl\n",
      "1.5_GENIE3_linkList.csv           motifs-v9-nr.mgi-m0.001-o0.0.tbl\n",
      "GSE60361.mtx.csv                  \u001b[1m\u001b[36msc-cancer-compendium\u001b[m\u001b[m\n",
      "GSE60361_C1-3005-Expression.txt   \u001b[1m\u001b[36msc-map-datasets\u001b[m\u001b[m\n",
      "exp_mtx.csv                       \u001b[1m\u001b[36mzeisel_et_al\u001b[m\u001b[m\n"
     ]
    }
   ],
   "source": [
    "!ls {DATA_FOLDER}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Preliminary work: convert RData "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_tfs = pd.read_csv(os.path.join(DATA_FOLDER, '1.2_inputTFs.csv'))\n",
    "with open(os.path.join(DATA_FOLDER, 'input_tfs.txt'), 'wt') as f:\n",
    "    f.write(\"\\n\".join(df_tfs.x.values) + \"\\n\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "pd.read_csv(os.path.join(DATA_FOLDER, '1.1_exprMatrix_filtered.csv'), index_col=0).T.to_csv(os.path.join(DATA_FOLDER, 'exp_mtx.csv'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Preliminary work: create adjacency list according to GRNBoost2 algorithm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from arboreto.utils import load_tf_names\n",
    "from arboreto.algo import grnboost2\n",
    "import pandas as pd\n",
    "import os\n",
    "from dask.distributed import LocalCluster, Client\n",
    "\n",
    "DATA_FOLDER='.'\n",
    "\n",
    "if __name__ == '__main__':\n",
    "    ex_matrix = pd.read_csv(os.path.join(DATA_FOLDER, 'exp_mtx.csv'), index_col=0)\n",
    "    tf_names = load_tf_names(os.path.join(DATA_FOLDER, 'input_tfs.txt'))\n",
    "\n",
    "    local_cluster = LocalCluster(n_workers=48, threads_per_worker=1)\n",
    "    client = Client(local_cluster)\n",
    "\n",
    "    adjacencies = grnboost2(expression_data=ex_matrix, tf_names=tf_names, verbose=True, client_or_address=client)\n",
    "    adjacencies.to_csv(os.path.join(DATA_FOLDER, 'grnboost2_adjacencies.tsv'), index=False, sep='\\t')\n",
    "\n",
    "    client.close()\n",
    "    local_cluster.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Compare adjacency lists"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "adjacencies_genie3 = pd.read_csv(os.path.join(DATA_FOLDER, '1.5_GENIE3_linkList.csv'), usecols=[1, 2, 3]).sort_values(by='weight', ascending=False)\n",
    "adjacencies_genie3.rename(columns={'Target': 'target', 'weight': 'importance'}, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>TF</th>\n",
       "      <th>target</th>\n",
       "      <th>importance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Dab2</td>\n",
       "      <td>Pf4</td>\n",
       "      <td>0.173916</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Dab2</td>\n",
       "      <td>Mrc1</td>\n",
       "      <td>0.167264</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Dab2</td>\n",
       "      <td>Cbr2</td>\n",
       "      <td>0.146576</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Dab2</td>\n",
       "      <td>Tyrobp</td>\n",
       "      <td>0.144853</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Dab2</td>\n",
       "      <td>Stab1</td>\n",
       "      <td>0.142367</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     TF  target  importance\n",
       "0  Dab2     Pf4    0.173916\n",
       "1  Dab2    Mrc1    0.167264\n",
       "2  Dab2    Cbr2    0.146576\n",
       "3  Dab2  Tyrobp    0.144853\n",
       "4  Dab2   Stab1    0.142367"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "adjacencies_genie3.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "adjacencies_grnboost2 = pd.read_csv(os.path.join(DATA_FOLDER, 'grnboost2_adjacencies.tsv'), sep='\\t').sort_values(by='importance', ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>TF</th>\n",
       "      <th>target</th>\n",
       "      <th>importance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Rpl35</td>\n",
       "      <td>Rpl18a</td>\n",
       "      <td>99.115851</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Dab2</td>\n",
       "      <td>Mrc1</td>\n",
       "      <td>97.608051</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Rpl35</td>\n",
       "      <td>Rps28</td>\n",
       "      <td>95.306114</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Rpl35</td>\n",
       "      <td>Rpl32</td>\n",
       "      <td>94.416149</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Mylk</td>\n",
       "      <td>Myl9</td>\n",
       "      <td>93.607445</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      TF  target  importance\n",
       "0  Rpl35  Rpl18a   99.115851\n",
       "1   Dab2    Mrc1   97.608051\n",
       "2  Rpl35   Rps28   95.306114\n",
       "3  Rpl35   Rpl32   94.416149\n",
       "4   Mylk    Myl9   93.607445"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "adjacencies_grnboost2.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x10af96668>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_lim = 500000\n",
    "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12,4))\n",
    "df = adjacencies_grnboost2\n",
    "ax1.plot(df.index.values, df.importance, '-')\n",
    "ax1.set_xlim([0,y_lim])\n",
    "ax1.set_title('GRNBoost2')\n",
    "ax1.set_ylabel('importance')\n",
    "ax1.set_xlabel('adjacencies (sorted)')\n",
    "ax1.plot([0, y_lim], [0.001, 0.001], 'g-', label='0.001')\n",
    "ax1.plot([0, y_lim], [0.005, 0.005], 'r-', label='0.005')\n",
    "ax1.legend()\n",
    "df = adjacencies_genie3\n",
    "ax2.plot(df.index.values, df.importance, '-')\n",
    "ax2.set_xlim([0,y_lim])\n",
    "ax2.set_title('GENIE3')\n",
    "ax2.plot([0, y_lim], [0.001, 0.001], 'g-', label='0.001')\n",
    "ax2.plot([0, y_lim], [0.005, 0.005], 'r-', label='0.005')\n",
    "ax2.set_xlabel('adjacencies (sorted)')\n",
    "ax2.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.05    0.001037\n",
       "0.10    0.001077\n",
       "0.25    0.001216\n",
       "0.50    0.001567\n",
       "0.75    0.002385\n",
       "0.90    0.004364\n",
       "Name: importance, dtype: float64"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "percentiles = [0.05, 0.10, 0.25, 0.50, 0.75, 0.90]\n",
    "adjacencies_genie3.importance.quantile(percentiles)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.05    0.010404\n",
       "0.10    0.031795\n",
       "0.25    0.089075\n",
       "0.50    0.182801\n",
       "0.75    0.456872\n",
       "0.90    1.353637\n",
       "Name: importance, dtype: float64"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "percentiles = [0.05, 0.10, 0.25, 0.50, 0.75, 0.90]\n",
    "adjacencies_grnboost2.importance.quantile(percentiles)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/bramvandesande/miniconda3/envs/pyscenic_dev/lib/python3.6/site-packages/matplotlib/axes/_axes.py:6448: UserWarning: The 'normed' kwarg is deprecated, and has been replaced by the 'density' kwarg.\n",
      "  warnings.warn(\"The 'normed' kwarg is deprecated, and has been \"\n"
     ]
    },
    {
     "data": {
      "image/png": "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Nyoze/ZsrrzySgCuu+46Dj30UCKC2bNn09nZydq1a1m+fDlLly5l//3332Sx20ItSZKkITd27FguuugiDj/8cNavX88pp5zCnnvuyTnnnENHRwezZ8/m1FNP5YQTTqC9vZ2JEyfS2dkJwJ577smxxx7LjBkzGDt2LBdffDFjxowB4Pjjj+cnP7mNJ598nLa2Nr7whS9w6qmnNjb2hh6tRXRPAuDIHpIkScPHrFmzmDVr1kbrzj333A2vx48fz3e+851e9z377LM5++yzX7K+GH4PZsxobKyVRmVC7egekiRJahT7UEuSJEl1MKGWJEmS6mBCLUmSJNVhVPahliS1ju4byQEu32JoY5Gk3phQS5KGtY1uJD9kKCORpN7Z5UOSJEnDwk033cT06dNpb2/nvPPOe8n2tWvXctxxx9He3s4BBxzAQw89tGHbl7/8Zdrb25k+fTrz5s3bsH7KlCm8612vYebMmXR0dDQlbluoJUmSNOTWr1/P6aefzs0330xbWxv77bcfs2fPZkbFANKXXnop2223HcuWLaOzs5OzzjqLa665hiVLltDZ2cnixYt55JFHOOyww/j1r3+9YXKXyy+/lYMOmtS02G2hliRJ0pCbP38+7e3tTJs2jS222II5c+Ywd+7cjcrMnTuXE088EYBjjjmGW265hcxk7ty5zJkzh3HjxjF16lTa29uZP3/+JovdFmpJkiS96MwzYdGixh5z5ky44IJ+i6xYsYKdd955w3JbWxu33357n2XGjh3LhAkTWL16NStWrODAAw/caN8VK1YAEBF88INvY8stgw996EOcdtppjfpUG5hQS5Ikachl5kvWRURVZfrb92c/+xlPPjmZSZMe461vfSu77747Bx98cIOiLphQS5Ik6UUDtCQ3S1tbGw8//PCG5a6uLiZPntxrmba2NtatW8dTTz3FxIkT+9138uTJPPkkvOIVr+Doo49m/vz5DU+oR00f6j89Ax0dxWPHHYc6GkmSJFXab7/9WLp0KcuXL+e5556js7OT2bNnb1Rm9uzZXHnllQBcd911HHrooUQEs2fPprOzk7Vr17J8+XKWLl3K/vvvzzPPPMPTTz8NwDPPPMOPf/xj9tprr4bHPmpaqPOFinFMJUmSNKyMHTuWiy66iMMPP5z169dzyimnsOeee3LOOefQ0dHB7NmzOfXUUznhhBNob29n4sSJdHZ2ArDnnnty7LHHMmPGDMaOHcvFF1/MmDFjePTRRzn66KNZswbGjl3He9/7Xo444ojGx97wI0qSJEk1mDVrFrNmzdpo3bnnnrvh9fjx4/nOd77T675nn302Z5999kbrpk2bxl133cWSJVAx+l7DjZouH5IkSVIzmFBLkiRJdTChliRJkupgQi1JkiTVwYRakiRJqoMJtSRJklQHh82TJEnSRo48ElaubNzxdtwRfvCDgcv9/ve/58wzz2TBggWMGzeOKVOmcMEFF7DPPvuw++67s2bNGrbZZhtOP/10TjzxRACuuOIKPvWpT7HTTjsBsPfee3PVVVc1LvgqmFBLkiRpIytXNnZCvI6OgctkJkcffTQnnnjihglbFi1axKOPPsquu+7KnXfeCcCDDz7Iu9/9bl544QVOPvlkAI477jguuuiixgU8SE3t8hERR0TEAxGxLCI+08v2XSLi1oi4MyLujohZvR1HktR81tmShtKtt97K5ptvzoc//OEN62bOnMnOO++8Ublp06bx1a9+lQsvvHBTh9inpiXUETEGuBh4OzADOD4ies5R8zng2szcF5gD/Huz4pEk9c06W9JQu/fee3nd615XVdnXvva13H///RuWr7nmGmbOnMnMmTO5/PLLmxVin5rZ5WN/YFlmPggQEZ3AUcCSijIJvLx8PQF4pInxSJL6Zp0tqWVk5kbLI7nLx07AwxXLXeW6Sp8H3h8RXcANwEebGI8kqW/W2ZKG1J577skdd9xRVdk777yTPfbYo8kRVa+ZCXX0si57LB8PXJGZbcAs4FsR8ZKYIuK0iFgYEQtXrVrVhFAladQbVnX2PfcWNzF1dBSjA0ga+Q499FDWrl3LN77xjQ3rFixYwG9/+9uNyj300EN88pOf5KMfHT7/p29ml48uoLIXeRsv/XnwVOAIgMz8RUSMByYBj1UWysxLgEsAOjo6elbwkqT6Das6+7m1jR1hQNLg7LhjdSNzDOZ4A4kIvv/973PmmWdy3nnnMX78+A3D5v3mN79h33333TBs3kc/+tENI3wMB81MqBcAu0XEVGAFxQ0s7+1R5nfAW4ArImIPYDxgE7QkbXrW2ZI2qGbM6GaYPHky11577UvWP/vss33uc9JJJ3HSSSc1MaqBNa3LR2auA84A5gH3UdwZvjgizo2I2WWxTwAfjIi7gKuBk7JnL3NJUtNZZ0tS7Zo6sUtm3kBx40rlunMqXi8BDmpmDJKk6lhnS1JtmjqxiyRJklrDaP7Bqd7PbkItSZI0yo0fP57Vq1ePyqQ6M1m9ejXjx4+v+RhN7fIhSZKk4a+trY2uri5G6vDEv/89RG+Dg5bGjx9PW1tbzcc3oZYkSRrlNt98c6ZOnTrUYTTNCSc0dyhOu3xIkiRJdTChliRJkupgQi1JkiTVwYRakiRJqoMJtSRJklQHE2pJkiSpDibUkiRJUh1MqCVJkqQ6mFBLkiRJdTChliRJkupQ1dTjEdEBvAmYDDwL3Av8JDOfaGJskiRJ0rDXbwt1RJwUEb8CPgtsCTwAPAa8Ebg5Iq6MiF2aH6YkSZI0PA3UQr01cFBmPtvbxoiYCewG/K7RgUmSJEmtoN+EOjMvHmD7osaGI0mSJLWWqm5KjIhXR8QtEXFvubx3RHyuuaFJkiRJw1+1o3x8g6If9fMAmXk3MKdZQUmSJEmtotqEeqvMnN9j3bpGByNJkiS1mmoT6scjYlcgASLiGGBl06KSJEmSWkRV41ADpwOXALtHxApgOfD+pkUlSZIktYiqEurMfBA4LCK2BjbLzKebG5YkSZLUGqod5eMfI2LbzHwmM5+OiO0i4kvNDk6SJEka7qrtQ/32zHyyeyEz/wDMak5IkiRJUuuoNqEeExHjuhciYktgXD/lJUmSpFGh2psS/xO4JSIupxjp4xTgyqZFJUmSJLWIam9KPD8i7gHeAgTwxcyc19TIJEmSpBZQbQs1mXkjcGMTY5EkSZJaTrWjfLw7IpZGxFMR8ceIeDoi/tjs4CRJkqThrtoW6vOBIzPzvmYGI0mSJLWaakf5eNRkWpIkSXqpaluoF0bENcB/AWu7V2bm95oSlSRJktQiqm2hfjnwZ+BtwJHl450D7RQRR0TEAxGxLCI+00eZYyNiSUQsjohvVxu4JKmxrLMlqTbVDpt38mAPHBFjgIuBtwJdwIKIuD4zl1SU2Q34LHBQZv4hIl4x2PeRJNXPOluSaldVQh0R44FTgT2B8d3rM/OUfnbbH1iWmQ+Wx+gEjgKWVJT5IHBxOZU5mfnYoKKXJDWKdbYk1ajaLh/fAl4FHA78D9AGPD3APjsBD1csd5XrKr0aeHVE/CwifhkRR1QZjySpsayzJalG1SbU7Zn5d8AzmXkl8A7gNQPsE72syx7LY4HdgEOA44FvRsS2LzlQxGkRsTAiFq5atarKkCVJg2CdLUk1qjahfr58fjIi9gImAFMG2KcL2LliuQ14pJcyczPz+cxcDjxAUVlvJDMvycyOzOzYYYcdqgxZkjQI1tmSVKNqE+pLImI74HPA9RR96v5pgH0WALtFxNSI2AKYU+5b6b+ANwNExCSKnxMfrDImSVLjWGdLUo2qHYf6lvImlJ8C0wAiYmp/O2Tmuog4A5gHjAEuy8zFEXEusDAzry+3vS0ilgDrgU9l5uoaP4skqUbW2ZJUu2oT6u8Cr+2x7jrgdf3tlJk3ADf0WHdOxesEPl4+JElDyDpbkmrTb0IdEbtTDJU3ISLeXbHp5VQMnydJkiSNVgO1UE+nmBFxW4rZEbs9TTEeqSRJkjSq9ZtQZ+bciPghcFZm/uMmikmSJElqGQOO8pGZ6ymmopUkSZLUQ7U3Jf48Ii4CrgGe6V6Zmb9qSlSSJElSi6g2oX5D+XxuxboEDm1sOJIkSVJrqSqhzsw3NzsQSZIkqRVVNVNiREyIiK9GxMLy8X8iYkKzg5MkSZKGu2qnHr+MYqi8Y8vHH4HLmxWUJEmS1Cqq7UO9a2a+p2L5CxGxqBkBSZIkSa2k2hbqZyPijd0LEXEQ8GxzQpIkSZJaR7Ut1H8NXFn2mw7gCeDEpkUlSZIktYhqR/lYBOwTES8vl//Y1KgkSZKkFlHtKB/bR8SFwG3ArRHxrxGxfVMjkyRJklpAtX2oO4FVwHuAY8rX1zQrKEmSJKlVVNuHemJmfrFi+UsR8a5mBCRJkiS1kmpbqG+NiDkRsVn5OBb4UTMDkyRJklpBtQn1h4BvA8+Vj07g4xHxdER4g6IkSZJGrWpH+dim2YFIkiRJrajaPtRExN7AlMp9MvN7TYhJkiRJahlVJdQRcRmwN7AYeKFcnYAJtSRJkka1aluoD8zMGU2NRJIkSWpB1d6U+IuIMKGWJEmSeqi2hfpKiqT698BaIIDMzL2bFpkkSZLUAqpNqC8DTgDu4cU+1JIkSdKoV21C/bvMvL6pkUiSJEktqNqE+v6I+DbwA4ouH4DD5kmSJEnVJtRbUiTSb6tY57B5kiRJGvWqnSnx5GYHIkmSJLWifhPqiPh0Zp4fEf9G0SK9kcz8m6ZFJkmSJLWAgVqo7yufFzY7EEmSJKkV9ZtQZ+YPyucrN004kiRJUmupdqZEIuLTlc+SJEmSBpFQA3N6PEuSJEmj3mAS6m7R8CgkSZKkFlVLQl21iDgiIh6IiGUR8Zl+yh0TERkRHc2MR5LUN+tsSapN0xLqiBgDXAy8HZgBHB8RM3optw3wN8DtzYpFktQ/62xJql0zW6j3B5Zl5oOZ+RzQCRzVS7kvAucDa5oYiySpf9bZklSjwSTUt5XPt1ZZfifg4YrlrnLdBhGxL7BzZv6wvwNFxGkRsTAiFq5atarKt5ckDYJ1tiTVqOqEOjM/Xvlchd5uXtww22JEbAb8C/CJKt77kszsyMyOHXbYocq3lyQNgnW2JNVowIQ6IraKiH16rNslInbqa59SF7BzxXIb8EjF8jbAXsBtEfEQcCBwvTe5SNKQsM6WpBpV00L9PPC9iNi6Yt03gR0H2G8BsFtETI2ILSjGr76+e2NmPpWZkzJzSmZOAX4JzM5MpzmXpE3POluSajRgQp2ZzwPfB46DonUa2GGgSjQz1wFnAPOA+4BrM3NxRJwbEbPrjlyS1DDW2ZJUu7FVlvsm8A3gMuADwOXV7JSZNwA39Fh3Th9lD6kyFklSE1hnS1JtqkqoM/P+iCAiXg0cD7yxuWFJkiRJrWEww+ZdStFSfXdm/qFJ8UiSJEktZTAJ9bXAPhSJtSRJkiSq70NNZv4ZmNDEWCRJkqSW028LdUTs18+2ExofjiRJktRaBurycWlE/EdEbNu9IiL2ioifAu9pbmiSJEnS8DdQQv1a4HfAnRFxSkT8C/Bd4PzMfFfTo5MkSZKGuX77UJcD/X85ItZRjPDxCLB/Zj7S336SJEnSaDFQH+pdI2Ie8GZgD+CfgZ9GxMmbIjhJkiRpuBuoy8c84BuZOSszH8jMC4CDgcMj4mfND0+SJEka3gYaNm9mZv6pckXZ3WNORBzWvLAkSZKk1jBQC/WkvjZk5k+i0NbgmCRJkqSWMVAL9VciYjNgLnAHsAoYD7RT9Kt+C/D3QFczg5QkSZKGq4FG+firiJgBvA84BXgV8CxwH3AD8A+ZuabpUUqSJEnD1EBdPsjMJcCXgB9QJNLLgQXAdSbTkiRJGu0G6vLR7Urgj8CF5fLxwFXAsc0ISpIkSWoV1SbU0zNzn4rlWyPirmYEJEmSJLWSAbt8lO6MiAO7FyLiAMBxqCVJkjTqVdtCfQDwgYj4Xbm8C3BfRNwDZGbu3ZToJEmSpGGu2oT6iKZGIUmSJLWoqhLqzPxtswORJEmSWlG1faglSZIk9cKEWpIkSaqDCbUkSZJUBxNqSZIkqQ4m1JIkSVIdTKglSZKkOphQS5IkSXUwoZYkSZLqYEItSZIk1cGEWpIkSaqDCbUkSZJUBxNqSZIkqQ4m1JIkSVIdmppQR8QREfFARCyLiM/0sv3jEbEkIu6OiFsi4i+aGY8kqW/W2ZJUm6Yl1BExBrgYeDswAzg+Imb0KHYn0JGZewPXAec3Kx5JUt+ssyWpds1sod4fWJaZD2bmc0AncFRlgcy8NTP/XC7+EmhrYjySpL5ZZ0tSjZqZUO8EPFyx3FWu68upwI29bYiI0yJiYUQsXLVqVQNDlCSVrLMlqUbNTKijl3XZa8GI9wMdwFd6256Zl2RmR2Z27LDDDg0MUZJUss6WpBqNbeKxu4CdK5bbgEd6FoqIw4Czgb/MzLVNjEeS1DfrbEmqUTNbqBcAu0XE1IjYApgDXF9ZICL2Bb4OzM7Mx5oYiySpf9bZklSjpiXUmbkOOAOYB9wHXJuZiyPi3IiYXRb7CvAy4DsRsSgiru/jcJKkJrLOlqTaNbPLB5l5A3BDj3XnVLw+rJnvL0mqnnW2JNXGmRIlSZKkOphQS5IkSXUwoZYkSZLqYEItSZIk1cGEWpIkSaqDCbUkSZJUBxNqSZIkqQ4m1JIkSVIdTKglSZKkOphQS5IkSXUwoZYkSZLqYEItSZIk1cGEWpIkSaqDCbUkSZJUBxNqSZIkqQ4m1JIkSVIdTKglSZKkOphQS5IkSXUwoZYkSZLqYEItSZIk1cGEWpIkSaqDCbUkSZJUBxNqSZIkqQ4m1JIkSVIdTKglSZKkOphQS5IkSXUwoZYkSZLqYEItSZIk1cGEWpIkSaqDCbUkSZJUBxNqSZIkqQ4m1JIkSVIdTKglSZKkOphQS5IkSXVoakIdEUdExAMRsSwiPtPL9nERcU25/faImNLMeCRJfbPOlqTaNC2hjogxwMXA24EZwPERMaNHsVOBP2RmO/AvwD81Kx5JUt+ssyWpds1sod4fWJaZD2bmc0AncFSPMkcBV5avrwPeEhHRxJgkSb2zzpakGo1t4rF3Ah6uWO4CDuirTGaui4ingO2BxysLRcRpwGnl4p8i4oEa4plExOMDF2tZk+hx3kaYkfz5RvJngxH8+cpUcjCf7y+aFkz9hlOdPQl4PC7qJ1cf2jx+uH+nja8+xlefYRtfDXU2VFlvNzOh7q22yxrKkJmXAJfUFUzEwszsqOcYw5mfr3WN5M8Gfr4WMmzq7OF+To2vPsZXH+OrT7Pia2aXjy5g54rlNuCRvspExFhgAvBEE2OSJPXOOluSatTMhHoBsFtETI2ILYA5wPU9ylwPnFi+Pgb478x8SWuHJKnprLMlqUZN6/JR9q87A5gHjAEuy8zFEXEusDAzrwcuBb4VEcsoWjnmNCse6uwy0gL8fK1rJH828PO1hGFWZw/3c2p89TG++hhffZoSX9i4IEmSJNXOmRIlSZKkOphQS5IkSXUY8Ql2cofGAAAKrElEQVT1QFPptpqI2Dkibo2I+yJicUT8bbl+YkTcHBFLy+fthjrWekTEmIi4MyJ+WC5PLac6XlpOfbzFUMdYq4jYNiKui4j7y+v4+pF0/SLiY+V3896IuDoixrfy9YuIyyLisYi4t2Jdr9crCheW9c3dEfHaoYt8eKhnOvOI+Gy5/oGIOLzaY26K+CLirRFxR0TcUz4fWrHPbeUxF5WPVwxBfFMi4tmKGL5Wsc/ryriXld/Xmgf1riO+91XEtigiXoiImeW2TXn+Do6IX0XEuog4pse2E8t/40sj4sSK9Zvy/PUaX0TMjIhfRFHX3h0Rx1VsuyIillecv5mbOr5y2/qKGK6vWD81GvT3oI7z9+Ye3781EfGucltt5y8zR+yD4saa3wDTgC2Au4AZQx1XnZ9pR+C15ettgF9TTBN8PvCZcv1ngH8a6ljr/JwfB74N/LBcvhaYU77+GvDXQx1jHZ/tSuB/la+3ALYdKdePYuKP5cCWFdftpFa+fsDBwGuBeyvW9Xq9gFnAjRTjNR8I3D7U8Q/xuRuwDgY+AnytfD0HuKZ8PaMsPw6YWh5nTCPr9Trj2xeYXL7eC1hRsc9tQMcQn78pld/ZHvvMB15ffk9vBN6+qePrUeY1wINDdP6mAHsDVwHHVKyfCDxYPm9Xvt5uCM5fX/G9GtitfD0ZWAlsWy5fUVl2KM5fue1PfRy3IX8P6o2vx7V+AtiqnvM30luoq5lKt6Vk5srM/FX5+mngPookpnJK4CuBdw1NhPWLiDbgHcA3y+UADqWY6hha+PNFxMspErRLATLzucx8khF0/ShGD9oyinGKt6Ko6Fv2+mXmT3npWMt9Xa+jgKuy8Etg24jYcdNEOizVM535UUBnZq7NzOXAsvJ4jazXa44vM+/MzO5xuhcD4yNiXI1xNDy+vg5Yfh9fnpm/yCJ7uIra/z02Kr7jgatrjKGu+DLzocy8G3ihx76HAzdn5hOZ+QfgZuCITX3++oovM3+dmUvL148AjwE71BhHw+PrS4P/njcqvmOAGzPzzzXGAYz8Lh+9TaW70xDF0nDlT2f7ArcDr8zMlVAk3UDNP5ENAxcAn+bFfwDbA09m5rpyuZWv4zRgFXB5FF1avhkRWzNCrl9mrgD+GfgdRSL9FHAHI+f6devreo3oOqcG1ZyPjaYzp/jObN/Pvo08x/XEV+k9wJ2ZubZi3eXlz8V/V0eXgHrjm1rWM/8TEW+qKN81wDE3VXzdjuOlCfWmOn+D3XdTn78BRcT+FC20v6lY/Q9lV5B/qeM/evXGNz4iFkbEL7u7U9DYv+eNqgvm8NLv36DP30hPqKuaJrcVRcTLgO8CZ2bmH4c6nkaJiHcCj2XmHZWreynaqtdxLEX3gf/IzH2BZyi6DIwIUfQlPoriJ/rJwNbA23sp2qrXbyAj6bvaCPVMZz7Y9bWoe7r1iNgT+CfgQxXb35eZrwHeVD5OGIL4VgK7lPXMx4Fvl7+QDbfzdwDw58y8t2L7pjx/g913U5+//g9QtJh/Czg5M7sboT4L7A7sR9Gd4awhim+XLKb4fi9wQUTs2oBjVmrU+XsNxfj73Wo6fyM9oa5mKt2WExGbUyTT/zczv1eufrT7p+Xy+bGhiq9OBwGzI+Ihip9vDqVosd627EIArX0du4CuzLy9XL6OIsEeKdfvMGB5Zq7KzOeB7wFvYORcv259Xa8RWefUoZ7pzPvat5HnuK7p1svuad8HPpCZG1oHy19qurvlfZvip+lNGl/ZVWZ1GccdFK2Xry7Ltw1wzKbHV7H9Ja2Dm/j8DXbfTX3++lT+B+lHwOfKLmbAhq6hWf5icjlDc/66u6KQmQ9S9IvfF3icxv09aERdcCzw/fLvFWW8NZ2/kZ5QVzOVbkspf/q6FLgvM79asalySuATgbmbOrZGyMzPZmZbZk6huF7/nZnvA26l6OcErf35fg88HBHTy1VvAZYwQq4fRVePAyNiq/K72v35RsT1q9DX9boe+EAUDgSe6u4aMkrVM5359cCcKEaJmArsRnEzWCPr9Zrji4htKZKZz2bmz7oLR8TYiJhUvt4ceCdwL7WpJ74dImJMGcc0ivP3YPl9fDoiDiz/jX6A2v891jVdfURsBvwVReMJ5bpNff76Mg94W0RsV/7y9jZg3hCcv16V5b9Pcc/Gd3ps6/7PflD0T97k5688b+PK15MoGsuWlNe+UX8PGlEXvKT/fs3nL+u8C3S4Pyjuuv81xf/Ozx7qeBrwed5I8ZPG3cCi8jGLol/SLcDS8nniUMfagM96CC+O8jGN4o/pMuA7wLihjq+OzzUTWFhew/+iuIN8xFw/4AvA/WUl9C2KURpa9vqVle1K4HmKFpFT+7peFD9BXlzWN/fQgJEKWv3RWx0MnAvMLl+PL78Ty8rvyLSKfc8u93uAipEUGlmv1xof8DmKLluLKh6voOjmdEf573sx8K/AmCGI7z3l+98F/Ao4suKYHeW/z98AF1HOmjwE1/cQ4Jc9jrepz99+5b/rZ4DVwOKKfU8p415G0aViKM5fr/EB76eokyq/fzPLbf9NUf/cC/wn8LIhiO8NZQx3lc+nVhyzYX8P6ry+U4AVwGY9jlnT+XPqcUmSJKkOI73LhyRJktRUJtSSJElSHUyoJUmSpDqYUEuSJEl1MKGWJEmS6mBCrWEvIn6+id9vSkS8d1O+pySNFNbZGo1MqDXsZeYbNtV7lbM3TaGYKlWSNEjW2RqNHIdaw15E/CkzXxYRh1BMGvIoxeQo36MYfP1vgS2Bd2XmbyLiCmANsCfwSuDjmfnDiBgP/AfFoPzryvW3RsRJwDsoJiDYGtgK2ANYDlxJMRvVt8ptAGdk5s/LeD5PMZXqXhSTEbw/MzMi9qOYkGBrYC3FjIF/Bs6jmMxgHHBxZn69wadLkoaUdbZGo7EDF5GGlX0oKs4ngAeBb2bm/hHxt8BHgTPLclOAvwR2BW6NiHbgdIDMfE1E7A78OCJeXZZ/PbB3Zj5RVrqfzMx3AkTEVsBbM3NNROxGMXNeR7nfvhR/BB4BfgYcFBHzgWuA4zJzQUS8HHiWYoa9pzJzv3JK1p9FxI8zc3kTzpMkDQfW2RoVTKjVahZk5kqAiPgN8ONy/T3AmyvKXZuZLwBLI+JBYHeKadv/DSAz74+I3wLdlfPNmflEH++5OXBRRMwE1lfsAzA/M7vKeBZR/FF4CliZmQvK9/pjuf1twN4RcUy57wRgN4pWFUkaiayzNSqYUKvVrK14/ULF8gts/H3u2ZcpgejnuM/0s+1jFD9Z7kNx38GaPuJZX8YQvbw/5fqPZua8ft5LkkYS62yNCt6UqJHqryJis4jYFZgGPAD8FHgfQPmz4S7l+p6eBrapWJ5A0XrxAnACMGaA974fmFz2ySMitilvnJkH/HVEbN4dQ0Rs3c9xJGm0sM5WS7OFWiPVA8D/UNzg8uGyL92/A1+LiHsobnA5KTPXRrykEeRuYF1E3AVcAfw78N2I+CvgVvpvGSEzn4uI44B/i4gtKfriHQZ8k+LnxV9F8aargHc14sNKUouzzlZLc5QPjTjlHeM/zMzrhjoWSVL/rLM1EtjlQ5IkSaqDLdSSJElSHWyhliRJkupgQi1JkiTVwYRakiRJqoMJtSRJklQHE2pJkiSpDv8f+4H1/+XLEz8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 864x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12,4))\n",
    "df = adjacencies_grnboost2\n",
    "ax1.hist(df.importance, normed=True, cumulative=True, histtype='step',label='GRNBoost2', alpha=0.8, color='b', bins=100)\n",
    "ax1.set_title('GRNBoost2')\n",
    "ax1.set_ylim([0, 1.01])\n",
    "ax1.plot([0.001] * 2, [0, 1.01], 'g')\n",
    "ax1.plot([0.005] * 2, [0, 1.01], 'r')\n",
    "ax1.set_ylabel('p(X<=importance)')\n",
    "ax1.set_xlabel('importance')\n",
    "df = adjacencies_genie3\n",
    "ax2.hist(df.importance, normed=True, cumulative=True, histtype='step',label='CDF', alpha=0.8, color='b', bins=100)\n",
    "ax2.set_title('GENIE3')\n",
    "ax2.set_ylim([0, 1.01])\n",
    "ax2.plot([0.001] * 2, [0, 1.01], 'g', label='0.001')\n",
    "ax2.plot([0.005] * 2, [0, 1.01], 'r', label='0.005')\n",
    "ax2.set_ylabel('')\n",
    "ax2.set_xlabel('importance')\n",
    "ax2.legend()\n",
    "pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.0, 91.82930632121473]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from scipy import stats\n",
    "\n",
    "[stats.percentileofscore(adjacencies_genie3.importance, thr) for thr in [0.001, 0.005]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pyscenic.utils import modules4thr, modules4top_factors, modules4top_targets\n",
    "from itertools import chain, repeat\n",
    "from collections import defaultdict\n",
    "from operator import attrgetter\n",
    "import seaborn as sns\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def derive_modules(adjacencies):\n",
    "    thresholds = [0.001, 0.005]\n",
    "    percentiles = [0.05, 0.10, 0.25, 0.50, 0.75, 0.90]\n",
    "    top_n_targets = [50,]\n",
    "    top_n_regulators = [5,10,50]\n",
    "    return chain(\n",
    "        chain.from_iterable(map(lambda thr: modules4thr(adjacencies, thr), thresholds)),\n",
    "        chain.from_iterable(map(lambda t: modules4thr(adjacencies, t[0], pattern=\"weight>{}%\".format(t[1]*100)),\n",
    "                                zip(list(adjacencies.importance.quantile(percentiles)), percentiles))),\n",
    "        chain.from_iterable(map(lambda n: modules4top_targets(adjacencies, n), top_n_targets)),\n",
    "        chain.from_iterable(map(lambda n: modules4top_factors(adjacencies, n), top_n_regulators)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "modules_genie3 = list(derive_modules(adjacencies_genie3))\n",
    "modules_grnboost2 = list(derive_modules(adjacencies_grnboost2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "12022"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(modules_genie3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "12035"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(modules_grnboost2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "def todict(modules):\n",
    "    def singleton(context):\n",
    "        return next(iter(context))\n",
    "\n",
    "    name2modules = defaultdict(list)\n",
    "    for module in modules:\n",
    "        name2modules[singleton(module.context)].append(module)\n",
    "    return name2modules"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "def stats(modules, name):\n",
    "    def gettype(module):\n",
    "        # (+) Is also used for indicating no correlation assessed between TF and its target gene.\n",
    "        return \"(-)\" if \"repressing\" in module.context else \"(+)\"\n",
    "\n",
    "    return pd.DataFrame(\n",
    "            data=list(\n",
    "                zip(map(len, modules), \n",
    "                    repeat(name), \n",
    "                    map(attrgetter('transcription_factor'), modules),\n",
    "                    map(gettype, modules)), \n",
    "                ), \n",
    "            columns=['size', 'method', 'tf', 'type'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/bramvandesande/miniconda3/envs/pyscenic_dev/lib/python3.6/site-packages/matplotlib/cbook/__init__.py:1859: RuntimeWarning: invalid value encountered in double_scalars\n",
      "  loval = q1 - whis * stats['iqr']\n",
      "/Users/bramvandesande/miniconda3/envs/pyscenic_dev/lib/python3.6/site-packages/matplotlib/cbook/__init__.py:1860: RuntimeWarning: invalid value encountered in double_scalars\n",
      "  hival = q3 + whis * stats['iqr']\n",
      "/Users/bramvandesande/miniconda3/envs/pyscenic_dev/lib/python3.6/site-packages/matplotlib/cbook/__init__.py:1872: RuntimeWarning: invalid value encountered in less_equal\n",
      "  wiskhi = np.compress(x <= hival, x)\n",
      "/Users/bramvandesande/miniconda3/envs/pyscenic_dev/lib/python3.6/site-packages/matplotlib/cbook/__init__.py:1879: RuntimeWarning: invalid value encountered in greater_equal\n",
      "  wisklo = np.compress(x >= loval, x)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x144c31eb8>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "name2modules = todict(modules_genie3)\n",
    "fig, (ax2, ax3) = plt.subplots(1, 2, figsize=(12,4))\n",
    "df = pd.concat([stats(modules, name) for name, modules in name2modules.items()])\n",
    "ax2.set_ylabel('#')\n",
    "ax2.set_title('TFs')\n",
    "df[['method', 'type', 'tf']].drop_duplicates().groupby(['method', 'type'])['method'].count().unstack('type').plot(kind='bar', stacked=True, ax=ax2, legend=False)\n",
    "ax2.set_xlabel('parameters')\n",
    "\n",
    "ax3.set_yscale(\"log\")\n",
    "sns.boxplot(y=\"size\", x=\"method\", hue='type', data=df.sort_index(), whis=np.inf, ax=ax3)\n",
    "ax3.yaxis.grid(True)\n",
    "ax3.set(ylabel=\"\", title='Targets')\n",
    "sns.despine(trim=True, left=True)\n",
    "plt.xticks(rotation=90)\n",
    "ax3.set_xlabel('parameters')\n",
    "ax3.legend([])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/bramvandesande/miniconda3/envs/pyscenic_dev/lib/python3.6/site-packages/matplotlib/cbook/__init__.py:1859: RuntimeWarning: invalid value encountered in double_scalars\n",
      "  loval = q1 - whis * stats['iqr']\n",
      "/Users/bramvandesande/miniconda3/envs/pyscenic_dev/lib/python3.6/site-packages/matplotlib/cbook/__init__.py:1860: RuntimeWarning: invalid value encountered in double_scalars\n",
      "  hival = q3 + whis * stats['iqr']\n",
      "/Users/bramvandesande/miniconda3/envs/pyscenic_dev/lib/python3.6/site-packages/matplotlib/cbook/__init__.py:1872: RuntimeWarning: invalid value encountered in less_equal\n",
      "  wiskhi = np.compress(x <= hival, x)\n",
      "/Users/bramvandesande/miniconda3/envs/pyscenic_dev/lib/python3.6/site-packages/matplotlib/cbook/__init__.py:1879: RuntimeWarning: invalid value encountered in greater_equal\n",
      "  wisklo = np.compress(x >= loval, x)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1a5ab6eba8>"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "name2modules = todict(modules_grnboost2)\n",
    "fig, (ax2, ax3) = plt.subplots(1, 2, figsize=(12,4))\n",
    "df = pd.concat([stats(modules, name) for name, modules in name2modules.items()])\n",
    "ax2.set_ylabel('#')\n",
    "ax2.set_title('TFs')\n",
    "df[['method', 'type', 'tf']].drop_duplicates().groupby(['method', 'type'])['method'].count().unstack('type').plot(kind='bar', stacked=True, ax=ax2, legend=False)\n",
    "ax2.set_xlabel('parameters')\n",
    "\n",
    "ax3.set_yscale(\"log\")\n",
    "sns.boxplot(y=\"size\", x=\"method\", hue='type', data=df.sort_index(), whis=np.inf, ax=ax3)\n",
    "ax3.yaxis.grid(True)\n",
    "ax3.set(ylabel=\"\", title='Targets')\n",
    "sns.despine(trim=True, left=True)\n",
    "plt.xticks(rotation=90)\n",
    "ax3.set_xlabel('parameters')\n",
    "ax3.legend([])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "ex_matrix = pd.read_csv(os.path.join(DATA_FOLDER, 'exp_mtx.csv'), index_col=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pyscenic.utils import modules_from_adjacencies\n",
    "\n",
    "modules = list(modules_from_adjacencies(adjacencies_grnboost2, ex_matrix, \"MGI\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8791"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(modules)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'activating',\n",
       " 'repressing',\n",
       " 'top10perTarget',\n",
       " 'top50',\n",
       " 'top50perTarget',\n",
       " 'top5perTarget',\n",
       " 'weight>10.0%',\n",
       " 'weight>5.0%'}"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from cytoolz import pipe\n",
    "from cytoolz.curried import map, mapcat\n",
    "set(pipe(modules, map(attrgetter('context')), mapcat(list)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.6.4 (pyscenic_dev)",
   "language": "python",
   "name": "pyscenic_dev"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
